# -*- coding=utf-8
# appid 已在配置中移除,请在参数 Bucket 中带上 appid。Bucket 由 BucketName-APPID 组成
# 1. 设置用户配置, 包括 secretId，secretKey 以及 Region
from qcloud_cos import CosConfig
from qcloud_cos import CosS3Client

from utils.settings.log_config import logger

__all__ = {'CommonUpload'}

import os

# bucker name
TX_COS_BUCKET_NAME = os.environ.get('TX_COS_BUCKET_NAME', '')

TX_COS_SECRETID = os.environ.get('TX_COS_SECRETID', '')  # 替换为用户的 secretId
TX_COS_SECRETKEY = os.environ.get('TX_COS_SECRETKEY', '')  # 替换为用户的 secretKey
TX_COS_REGION = os.environ.get('TX_COS_REGION', '')  # 替换为用户的 Region


class CommonUpload(object):
    def __init__(self):
        secret_id = TX_COS_SECRETID  # 替换为用户的 secretId
        secret_key = TX_COS_SECRETKEY  # 替换为用户的 secretKey
        region = TX_COS_REGION  # 替换为用户的 Region

        token = None  # 使用临时密钥需要传入 Token，默认为空，可不填
        scheme = 'https'  # 指定使用 http/https 协议来访问 COS，默认为 https，可不填
        config = CosConfig(Region=region,
                           SecretId=secret_id,
                           SecretKey=secret_key,
                           Token=token,
                           Scheme=scheme)
        # 2. 获取客户端对象
        self.client = CosS3Client(config)

    def cos_upload_file(self, file_name, key_name: str = ""):
        """
        上传文件接口:
        return url:文件下载地址
        """
        if key_name == "":
            key_name = file_name
        self.client.upload_file(
            Bucket=TX_COS_BUCKET_NAME,
            LocalFilePath=file_name,  # 本地文件的路径
            Key=key_name,  # 上传到桶之后的文件名
            PartSize=3,  # 上传分成几部分
            MAXThread=10,  # 支持最多的线程数
            EnableMD5=False  # 是否支持MD5
        )
        url = self.client.get_object_url(Bucket=TX_COS_BUCKET_NAME, Key=key_name)
        return url

    def cos_upload_file_from_buffer(self, file_chunk, key_name: str = ""):
        """上传文件buffer接口

        Args:
            file_chunk (_type_): _description_
            key_name (str, optional): _description_. Defaults to "".

        Returns:
            _type_: _description_
        """
        self.client.upload_file_from_buffer(
            Bucket=TX_COS_BUCKET_NAME,
            Key=key_name,  # 上传到桶之后的文件名
            Body=file_chunk,
            PartSize=3,  # 上传分成几部分
            MAXThread=10,  # 支持最多的线程数
        )
        url = self.client.get_object_url(Bucket=TX_COS_BUCKET_NAME, Key=key_name)
        return url


if __name__ == "__main__":
    logger.info("上传OSS功能测试")
    url = CommonUpload().cos_upload_file("D:/single_suse.png", "demo22.png")
    logger.info(f"上传成功:{url}")
